#include "TypeNode.h"

#include "ScriptCompiler/Token/Token.h"
#include "ScriptCompiler/AST/BracketNode.h"

bool CTypeNode::IsVoidType() const
{
    if(NameChain.Num()==1 && NameChain[0]->InnerType.HasValue() )
    {
        if(NameChain[0]->InnerType.GetValue()==EScriptInnerType::Void
            //&& FunctionParameters.Empty()
        )
        {
            return true;
        }
    }
    return false;
}

bool CTypeNode::IsVarType() const
{
    return NameChain.Num()==1 && NameChain[0]->Type==EScriptTokenType::Var;
}

void CTypeNode::DebugPrint(int32_t InDepth)
{
    //print depth
    for(int32_t i=0;i<InDepth;++i)
    {
        WH::Print(U"\t");
    }

    //print name chain
    for(uint64_t i=0;i<NameChain.Num();i++ )
    {
        if(i!=0)
        {
            WH::Print(U".");
        }
        WH::Print(NameChain[i]->ToString());
    }

    //print generic type
    if(GenericTypes.Num()>0)
    {
        WH::Print(U"<");
        for(uint64_t i=0;i<GenericTypes.Num();i++)
        {
            if(i!=0)
            {
                WH::Print(U",");
            }
            GenericTypes[i]->DebugPrint(0);
        }
        WH::Print(U">");
    }

    // if(FunctionParameters.Num()>0)
    // {
    //     WH::Print(U"(");
    //     for(uint64_t i=0;i<FunctionParameters.Num();i++)
    //     {
    //         if(i!=0)
    //         {
    //             WH::Print(U",");
    //         }
    //         FunctionParameters[i]->DebugPrint(0);
    //     }
    //     WH::Print(U")");
    // }

    if(Bracket.HasValue())
    {
        //WH::Print(U"[");
        Bracket.GetValue()->DebugPrint(0);
        //WH::Print(U"]");
        
    }
}

std::shared_ptr<CScriptToken> CTypeNode::GetFirstToken()
{
    return NameChain[0];
}
